package org.lestr.secuel.noyau.systemeLogique;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;

public class Regle implements Serializable {

	
	// Déclaration de constantes
	private static final long serialVersionUID = 1L;
	
	
	// Déclaration des attributs
	private String nom;
	private Collection<Condition> conditions;
	private Collection<Effet> effets;
	private Collection<RegleEcouteur> écouteurs;
	
	
	/** Constructeur */
	public Regle(){
		
		// Instanciation des attributs
		nom = "Nouvelle règle";
		conditions = new ArrayList<Condition>();
		effets = new ArrayList<Effet>();
		écouteurs = new ArrayList<RegleEcouteur>();
		
	}// FIN Constructeur
	
	
	/** Ajoute un condition au système logique */
	public void ajoutCondition(Condition condition){
	
		// Ajoute
		conditions.add(condition);
		
		// Prévient les écouteurs
		for(RegleEcouteur écouteur : écouteurs)
			écouteur.conditionAjoutée(this, condition);
		
	}// FIN ajoutCondition
	
	
	/** Retire un condition du sytsème logique */
	public void retraitCondition(Condition condition){
		
		// Retire
		conditions.remove(condition);
		
		// Prévient les écouteurs
		for(RegleEcouteur écouteur : écouteurs)
			écouteur.conditionRetirée(this, condition);
		
	}// FIN retraitCondition
	
	
	/** Retourne les conditions du système logiques */
	public Iterable<Condition> getConditions(){
		
		return conditions;
		
	}// FIN retConditions
	
	
	/** Ajoute un effet au système logique */
	public void ajoutEffet(Effet effet){
	
		// Ajoute
		effets.add(effet);
		
		// Prévient les écouteurs
		for(RegleEcouteur écouteur : écouteurs)
			écouteur.effetAjouté(this, effet);
		
	}// FIN ajoutEffet
	
	
	/** Retire un effet du sytsème logique */
	public void retraitEffet(Effet effet){
		
		// Retire
		effets.remove(effet);
		
		// Prévient les écouteurs
		for(RegleEcouteur écouteur : écouteurs)
			écouteur.effetRetiré(this, effet);
		
	}// FIN retraitEffet
	
	
	/** Retourne les effets du système logiques */
	public Iterable<Effet> getEffets(){
		
		return effets;
		
	}// FIN retEffets


	// Accesseurs
	public String getNom() {
		return nom;
	}
	public void setNom(String nom) {
		this.nom = nom;
	}


	// Déléguées
	public void ajoutEcouteur(RegleEcouteur o) {
		écouteurs.add(o);
	}
	public void retraitEcouteur(RegleEcouteur o) {
		écouteurs.remove(o);
	}


	@Override
	public String toString() {
		return getNom();
	}
	
	
}// FIN Classe
